package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import modelos.Cores;
import modelos.Fabricantes;

import modelos.Veiculos;

public class DAOVeiculo
{
	private static Connection conn;
	private PreparedStatement comando;
	private ResultSet result;

	public DAOVeiculo() {
		conn = ConnectionFactory.createConnection();
		
	}
	
	public void fechaConexao() throws SQLException
	{
		conn.close();
	}
	
	public void insereNovoVeiculo(int idFabricante, String nome, String imagem) throws SQLException
	{
		comando = conn.prepareStatement("INSERT INTO modelo (id_marca, nome, imagem) VALUES (?,?,?)");
		
		comando.setInt(1, idFabricante);
		comando.setString(2, nome);
		comando.setString(3, imagem);
		
		comando.execute();
		
		this.fechaConexao();
	}
	
	public List<Veiculos> buscaVeiculos() throws SQLException
	{
		List<Veiculos> veiculos = new ArrayList<Veiculos>();
		Veiculos veiculo = null;
		
		comando = conn.prepareStatement("SELECT veiculo.nome, veiculo.id_marca, veiculo.imagem, veiculo.id, marca.nome, versao.nome, versao.valor, versao.id FROM modelo as veiculo, marca as marca, versao as versao WHERE veiculo.id_marca = marca.id AND veiculo.id = versao.id_modelo");
		
		result = comando.executeQuery();
		
		while(result.next())
		{
			veiculo = new Veiculos();
			
			veiculo.setNome(result.getString("veiculo.nome"));
			veiculo.setIdFabricante(result.getInt("veiculo.id_marca"));
			veiculo.setImagem(result.getString("veiculo.imagem"));
			veiculo.setId(result.getInt("veiculo.id"));
			veiculo.setFabricante(result.getString("marca.nome"));
			veiculo.setIdVersao(result.getInt("versao.id"));
			veiculo.setVersao(result.getString("versao.nome"));
			veiculo.setValor(result.getDouble("versao.valor"));
			
			veiculos.add(veiculo);
		}
		
		this.fechaConexao();
		
		return veiculos;
	}
	
	public void insereVersao(String nome, int idModelo, int idMarca, double valor) throws SQLException
	{
		comando = conn.prepareStatement("INSERT INTO versao nome, id_modelo, id_marca, valor VALUES (?,?,?,?)");
		
		comando.setString(1, nome);
		comando.setInt(2, idModelo);
		comando.setInt(3, idMarca);
		comando.setDouble(4, valor);
		
		comando.execute();
		
		this.fechaConexao();
	}
	
	public String buscaFabricanteCarro(int id) throws SQLException
	{
		String marca = "";
		
		comando = conn.prepareStatement("SELECT nome FROM marca WHERE id = ?");
		
		comando.setInt(1, id);
		
		result = comando.executeQuery();
		
		if(result.next())
		{
			marca = result.getString("nome");
		}
		
		this.fechaConexao();
		
		return marca;
	}
	
	public void insereNovaVersao(int idModelo, int idFabricante, String versao, double valor) throws SQLException
	{
		comando = conn.prepareStatement("INSERT INTO versao id_modelo, id_fabricante, nome, valor VALUES (?,?,?,?)");
		
		comando.setInt(1, idModelo);
		comando.setInt(2, idFabricante);
		comando.setString(3, versao);
		comando.setDouble(4, valor);
		
		comando.execute();
		
		this.fechaConexao();
	}
	
	public void editaVeiculo(int id, String nome, int idFabricante, String imagem) throws SQLException
	{
		comando = conn.prepareStatement("UPDATE modelo SET (nome = ?, id_fabricante = ?, imagem = ?) WHERE id = ?");
		
		comando.setString(1, nome);
		comando.setInt(2, idFabricante);
		comando.setString(3, imagem);
		comando.setInt(4, id);
		
		comando.execute();
		
		this.fechaConexao();
	}
	
	public void deletaVeiculo(int id) throws SQLException
	{
		comando = conn.prepareStatement("DELETE FROM modelo WHERE id = ?");
		
		comando.setInt(1, id);
		
		comando.execute();
		
		this.fechaConexao();
	}
	
	public List<Fabricantes> buscaFabricante() throws SQLException
	{
		List<Fabricantes> marcas = new ArrayList<Fabricantes>();
		Fabricantes marca = null;
		comando = conn.prepareStatement("SELECT * FROM marca");
		
		result = comando.executeQuery();
		
		while(result.next())
		{
			marca = new Fabricantes();
			
			marca.setId(result.getInt("id"));
			marca.setImagem(result.getString("imagem"));
			marca.setNome(result.getString("nome"));
			
			marcas.add(marca);
		}
		
		this.fechaConexao();
		
		return marcas;
	}
	
	public List<Cores> buscaCores() throws SQLException
	{
		List<Cores> cores = new ArrayList<Cores>();
		Cores cor = new Cores();
		comando = conn.prepareStatement("SELECT * FROM cores");
		
		result = comando.executeQuery();
		
		while(result.next())
		{
			cor = new Cores();
			
			cor.setId(result.getInt("id"));
			cor.setNome(result.getString("nome"));
			cor.setValor(result.getString("valor"));
			
			cores.add(cor);
		}
		this.fechaConexao();
		
		return cores;
		
	}
	
	public List<Veiculos> buscaVersoes(int idModelo) throws SQLException
	{
		List<Veiculos> versoes = new ArrayList<Veiculos>();
		Veiculos versao = null;
		comando = conn.prepareStatement("SELECT * FROM versao WHERE id_modelo = ?");
		
		comando.setInt(1, idModelo);
		
		result = comando.executeQuery();
		
		while(result.next())
		{
			versao = new Veiculos();
			
			versao.setVersao(result.getString("nome"));
			versao.setValor(result.getDouble("valor"));
			
			versoes.add(versao);
		}
		
		this.fechaConexao();
		
		return versoes;
	}
	
	public void editaVersao(String nome, double valor, int idVersao) throws SQLException
	{
		comando = conn.prepareStatement("UPDATE versao SET (nome = ?, valor = ?) WHERE id = ?");
		
		comando.setString(1, nome);
		comando.setDouble(2, valor);
		comando.setInt(3, idVersao);
		
		comando.execute();
		
		this.fechaConexao();
	}
	
	public void excluiVersao(int idVersao) throws SQLException
	{
		comando = conn.prepareStatement("DELETE FROM modelo WHERE id = ?");
		
		comando.setInt(1, idVersao);
		
		comando.execute();
		
		this.fechaConexao();
	}
	
}
